
package co.yixiang.modules.shop.utils;

import org.apache.commons.lang3.StringUtils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;


public class DateUtils {

  public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

  public static String format(Calendar calendar) {
    Date d = calendar.getTime();
    return sdf.format(d);
  }

  /**
   * 把标准格式字符串(yyyy-MM-dd HH:mm:ss)转换为日期对象（java.util.Date）.
   *
   * @param datestr - 日期字符串  ,标准日期格式为 yyyy-MM-dd HH:mm:ss
   */
  public static Date parseStandardDate(String datestr) {
    Date date = null;
    try {
      if (StringUtils.isNotEmpty(datestr)) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        date = sdf.parse(datestr);
      }
    } catch (ParseException e) {
      e.printStackTrace();

       }
return date;
  }

  /**
   * 把日期对象（java.util.Date）格式化为标准日期格式 yyyy-MM-dd HH:mm:ss.
   *
   * @param date - 日期对象(java.util.Date)
   */
  public static String formatStandardDate(Date date) {
    String datestr = null;
    if (date == null) {
      return null;
    }
    try {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      datestr = sdf.format(date);
    } catch (Exception e) {
      e.printStackTrace();
    }

    return datestr;
  }


  /**
   * 把日期对象（java.util.Date）格式化为标准日期格式 yyyy-MM-dd .
   *
   * @param date - 日期对象(java.util.Date)
   */
  public static String formatDate(Date date) {
    String datestr = null;
    if (date == null) {
      return null;
    }
    try {

      datestr = sdf.format(date);
    } catch (Exception e) {
      e.printStackTrace();
    }

    return datestr;
  }
  /**
   * 把字符串转换为日期对象（java.util.Date）
   *
   * @param datestr - 日期字符串
   * @param dateFormat - 跟字符串对应的日期格式，例如： yyyy-MM-dd HH:mm:ss
   */
  public static Date parseString2Date(String datestr, String dateFormat) {

    Date date = null;
    try {
      SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
      date = sdf.parse(datestr);
    } catch (ParseException e) {
      e.printStackTrace();
    }

    return date;
  }

  /**
   * 把日期对象（java.util.Date）格式化为字符串
   *
   * @param date - 日期对象(java.util.Date)
   * @param dateFormat - 格式字符串，例如： yyyy-MM-dd HH:mm:ss
   */
  public static String formatDate2String(Date date, String dateFormat) {
    String datestr = null;
    if (date == null) {
      return null;
    }
    try {
      SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
      datestr = sdf.format(date);
    } catch (Exception e) {
      e.printStackTrace();
    }

    return datestr;
  }

  /**
   * 比较两个日期之间的大小
   *
   * @return 前者大于后者返回true 反之false
   */
  public static boolean compareDate(Date d1, Date d2) {
    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(d1);
    c2.setTime(d2);

    int result = c1.compareTo(c2);
    if (result >= 0) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * 获得昨天的结束时刻,YYYY-MM-DD 23:59:59
   */
  public static String getPreLastTime() {
    Calendar now = Calendar.getInstance();
    now.add(Calendar.DATE, -1);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date date = now.getTime();
    String before = sdf.format(date);
    return before + " 23:59:59";
  }

  /**
   * 获得日期的结束时刻,YYYY-MM-DD 23:59:59
   */
  public static Date getLastTime(Date date) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String before = sdf.format(date);
    return parseString2Date(before + " 23:59:59", "yyyy-MM-dd HH:mm:ss");
  }

  /**
   * 获得当天的开始时刻,YYYY-MM-DD 00:00:00
   */
  public static String getCurrentFirstTime() {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    return sdf.format(new Date()) + " 00:00:00";
  }

  /**
   * 获得当天的结束时刻,YYYY-MM-DD 23:59:59
   */
  public static String getCurrentLastTime() {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    return sdf.format(new Date()) + " 23:59:59";
  }

  /**
   * 转化为java.sql.Timestamp
   */
  public static java.sql.Timestamp toSqlTimeStamp(Date date) {

    if (null == date) {
      return null;
    }

    java.sql.Timestamp time = new java.sql.Timestamp(date.getTime());
    return time;
  }

  /**
   * 转化为java.sql.Date
   */
  public static java.sql.Date toSqlDate(Date date) {

    if (null == date) {
      return null;
    }

    java.sql.Date sqlDate = new java.sql.Date(date.getTime());
    return sqlDate;
  }

  /**
   * 获取指定日期所在星期的日期列表(周一到周日)
   */
  public static List<String> makeWeekdays(Date date) {

    if (date == null) {
      return null;
    }

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    // 定义星期一为一周的第一天
    final int FIRST_DAY = Calendar.MONDAY;

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);

    // 循环找到星期一那天的日期
    while (calendar.get(Calendar.DAY_OF_WEEK) != FIRST_DAY) {
      calendar.add(Calendar.DATE, -1);
    }

    List<String> weekdays = new ArrayList<String>(7);
    for (int i = 0; i < 7; i++) {
      String day = sdf.format(calendar.getTime());
      weekdays.add(day);
      // 计算下一天
      calendar.add(Calendar.DATE, 1);
    }

    return weekdays;
  }

  /**
   * 获取指定日期所在星期的日期列表(周一到周日)
   *
   * @param datestr 为 yyyy-MM-dd 格式日期字符串 例：2015-01-01
   */
  public static List<String> makeWeekdays(String datestr) {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    Date date = null;
    try {
      date = sdf.parse(datestr);
    } catch (ParseException e) {
      e.printStackTrace();
      return null;
    }

    return makeWeekdays(date);
  }

  /**
   * 比较两个日期是否在同一个星期（周一到周日为一个星期）
   *
   * @param date1 为 yyyy-MM-dd 格式日期字符串 例：2015-01-01
   * @param date2 为 yyyy-MM-dd 格式日期字符串 例：2015-01-02
   */
  public static boolean isSameWeek(String date1, String date2) {

    boolean flag = false;

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    // 非空判断
    if (StringUtils.isNotBlank(date1) && StringUtils.isNotBlank(date2)) {
      //检验格式
      try {
        sdf.parse(date1);
        sdf.parse(date2);
      } catch (ParseException e) {
        e.printStackTrace();
        return flag;
      }
    } else {
      return flag;
    }

    List<String> weekdays = makeWeekdays(date1);

    for (String day : weekdays) {
      if (day.equals(date2)) {
        flag = true;
        return flag;
      }
    }

    return flag;
  }

  /**
   * 比较两个日期是否同一个月
   *
   * @param date1 为 yyyy-MM-dd 格式日期字符串 例：2015-01-01
   * @param date2 为 yyyy-MM-dd 格式日期字符串 例：2015-01-02
   */
  public static boolean isSameMonth(String date1, String date2) {

    boolean flag = false;

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    // 非空判断
    if (StringUtils.isNotBlank(date1) && StringUtils.isNotBlank(date2)) {
      //检验格式
      try {
        sdf.parse(date1);
        sdf.parse(date2);
      } catch (ParseException e) {
        e.printStackTrace();
        return flag;
      }
    } else {
      return flag;
    }

    if (date1.substring(0, 7).equals(date2.substring(0, 7))) {
      flag = true;
    }

    return flag;
  }

  /**
   * 比较两个日期是否同一个月
   */
  public static boolean isSameMonth(Date date1, Date date2) {

    boolean flag = false;

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");

    String date1str = sdf.format(date1);
    String date2str = sdf.format(date2);

    if (date1str.equals(date2str)) {
      flag = true;
    }

    return flag;
  }

  public static String getDate(Date date) {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    return dateFormat.format(date);
  }

  public static String getTime(Date date) {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return dateFormat.format(date);
  }

  /**
   * 获得昨天的时间,yyyy-MM-dd HH:mm:ss
   */
  public static Date getNextDate() {
    Calendar now = Calendar.getInstance();
    now.add(Calendar.DATE, 1);
    Date date = now.getTime();
    return date;
  }

  /**
   * 时间相减，返回相差的秒数 result = frontDate - backDate
   */
  public static long subtractDate(Date frontDate, Date backDate) {

    long result = (long) 0.0;

    try {
      result = (frontDate.getTime() - backDate.getTime()) / 1000;
    } catch (Exception e) {
      e.printStackTrace();
    }

    return result;
  }
  /****
   * 传入具体日期 ，返回具体日期减一个月。
   *
   * @param date
   *            日期(2014-04-20)
   * @return 2014-03-20
   * @throws ParseException
   */
  public static String subMonth(String date) throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date dt = sdf.parse(date);
    Calendar rightNow = Calendar.getInstance();
    rightNow.setTime(dt);

    rightNow.add(Calendar.MONTH, -1);
    Date dt1 = rightNow.getTime();
    String reStr = sdf.format(dt1);

    return reStr;
  }

  /**
   * 将Date类型转为2019031534335类型
   * @param date 日期
   * @return
   */
  public static String formatSeriesStrByDateLong(Date date) {
    return formatDate2String(date, "yyyyMMddHHmmssSSS");
  }

  /**
   * 获取6-10 的随机位数数字
   * @param length	想要生成的长度
   * @return result
   */
  public static String getRandomAppendDate(Integer length) {
    String result = "";
    Random rand = new Random();
    int n = 20;
    if (null != length && length > 0) {
      n = length;
    }
    int randInt = 0;
    for (int i = 0; i < n; i++) {
      randInt = rand.nextInt(10);
      result += randInt;
    }
    return result;
  }
}
